// C++ Templates 第九章：在实践中使用模板
// 9.1 包含模型简介
// C++模板的实现采用"包含模型"(inclusion model)，这意味着模板的定义通常需要在使用点可见。
// 这种模型有其特定的优缺点和使用模式。

// 9.1.1 链接器错误
// 当使用模板时，最常见的错误之一是链接器错误，通常表现为"未定义的引用"(undefined reference)。
// 模板本身不是代码 而是生成代码的蓝图，只包含了.h文件，链接器找不到定义（没有实例化）

// 常见链接错误原因
// 1.模板定义不可见：
// header.h
template <typename T>
void process(T value); // 只有声明，没有定义

// main.cpp
#include "header.h"
int main()
{
    process(42); // 链接错误：未定义的引用
}
// 2.模板实例化不匹配：
// impl.cpp
template <typename T>
void process(T value) { /* 实现 */ }

// 显式实例化
template void process<int>(int);

// main.cpp
void process(double); // 声明
int main()
{
    process(3.14); // 链接错误：没有double版本的实例化
}

// 解决链接错误的方法
// 1.在头文件中提供完整定义：
// header.h
template <typename T>
void process(T value)
{
    // 完整实现
}

// 2.显式实例化：
// header.h
template <typename T>
void process(T value);

// 声明外部实例化
extern template void process<int>(int);

// impl.cpp
template <typename T>
void process(T value) { /* 实现 */ }

// 定义实例化
template void process<int>(int);

// 9.1.2 头文件中的模板
// 由于包含模型的特性，模板通常在头文件中完整定义。
// 头文件中定义模板的最佳实践

// 1.模板类的完整定义：
// MyTemplate.h
template <typename T>
class MyTemplate
{
public:
    void method1();
    T method2(T value);

private:
    T data;
};

// 在同一个头文件中实现成员函数
template <typename T>
void MyTemplate<T>::method1()
{
    // 实现
}

template <typename T>
T MyTemplate<T>::method2(T value)
{
    // 实现
    return value;
}

// 2.内联定义：
template <typename T>
class MyTemplate
{
public:
    void method1()
    {
        // 直接在类定义内实现
    }

    T method2(T value)
    {
        // 直接在类定义内实现
        return value;
    }

private:
    T data;
};

// 头文件组织：
// 对于简单模板，在单个头文件中定义所有内容
// 对于复杂模板，可以使用多个头文件：
